{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "6f7c3f4f-3be4-4625-ac85-c47051b80c1a",
   "metadata": {},
   "source": [
    "# NURBS - Undulated Window\n",
    "\n",
    "Author: Matteo Taccola"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "244085c7-636b-46e8-9ac3-b5e5a673ba70",
   "metadata": {},
   "source": [
    "This example shows how to use the NURBS geometry explicitly defining the parameters that generate the NURBS (control points, weights etc).\n",
    "Also more simple surface types are supported (Bezier, Rational Bezier, BSPLINE)  \n",
    "For this specific example a glass window is simulated. Both sides of the window have the same NURBS surface profile.\n",
    "This example has no practical applications. It is just to illustrate the use of the geometry"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "039b1bba-a055-4d2e-b9cb-5c7cce30044f",
   "metadata": {},
   "outputs": [],
   "source": [
    "from optiland.geometries import NurbsGeometry"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "751466e7-9bd6-4dce-a35e-4b04c32e9d20",
   "metadata": {},
   "outputs": [],
   "source": [
    "from optiland import analysis, optic, optimization\n",
    "from optiland.coordinate_system import CoordinateSystem\n",
    "from optiland.materials import IdealMaterial, Material\n",
    "from optiland.surfaces import Surface\n",
    "import optiland.backend as be"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7f9d656-e741-48b5-ab6e-3bc8b10d70d1",
   "metadata": {},
   "source": [
    "Define NURBS parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "40f4dd02-a019-441b-ac92-2edaf2889b39",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define the number of control points\n",
    "n_dim, n, m = 3, 15, 15\n",
    "\n",
    "# Aperture size\n",
    "size_x=50\n",
    "size_y=50\n",
    "\n",
    "# Define control points\n",
    "x = be.linspace(-size_x/2,size_x/2,n)\n",
    "y = be.linspace(-size_y/2,size_y/2,m)\n",
    "x,y = be.meshgrid(x,y)\n",
    "z = 2.0*be.sin(x*2*be.pi*2/size_x+y*2*be.pi*2/size_y)\n",
    "\n",
    "P = be.zeros((n_dim, n, m))\n",
    "P[0,:,:] = x.T\n",
    "P[1,:,:] = y.T\n",
    "P[2,:,:] = z.T\n",
    "    \n",
    "# Define the array of control point weights\n",
    "W = be.ones((n, m))\n",
    "\n",
    "# Maximum index of the control points (counting from zero)\n",
    "n = be.shape(P)[1] - 1\n",
    "m = be.shape(P)[2] - 1\n",
    "\n",
    "# Define the order of the basis polynomials\n",
    "# Linear (p = 1), Quadratic (p = 2), Cubic (p = 3), etc.\n",
    "# Set p = n (number of control points minus one) to obtain a Bezier\n",
    "p = 3\n",
    "q = 3\n",
    "\n",
    "# Define the knot vectors (clamped spline)\n",
    "# p+1 zeros, n-p equispaced points between 0 and 1, and p+1 ones.  In total r+1 points where r=n+p+1\n",
    "# q+1 zeros, m-p equispaced points between 0 and 1, and q+1 ones. In total s+1 points where s=m+q+1\n",
    "U = be.concatenate((be.zeros(p), be.linspace(0, 1, n - p + 2), be.ones(p)))\n",
    "V = be.concatenate((be.zeros(q), be.linspace(0, 1, m - q + 2), be.ones(q)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "bc083324-21bf-4a32-af13-6fb3316682d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "cs1 = CoordinateSystem(x=0, y=0, z=0, rx=0, ry=0, rz=0, reference_cs=None)\n",
    "cs2 = CoordinateSystem(x=0, y=0, z=5, rx=0, ry=0, rz=0, reference_cs=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6b170767-69ef-44bb-b1ce-d77276f49b29",
   "metadata": {},
   "outputs": [],
   "source": [
    "# if control points are passed radius and conic are ignored. The surface is built as NURBS from control points and weights \n",
    "nurbs_geo1 = NurbsGeometry(\n",
    "    coordinate_system=cs1,\n",
    "    radius = be.inf,\n",
    "    conic=0.0,\n",
    "    control_points=P, \n",
    "    weights=W, \n",
    "    u_degree=p, \n",
    "    v_degree=q, \n",
    "    u_knots=U, \n",
    "    v_knots=V\n",
    ")        \n",
    "nurbs_geo2 = NurbsGeometry(\n",
    "    coordinate_system=cs2,\n",
    "    radius = be.inf,\n",
    "    conic=0.0,\n",
    "    control_points=P, \n",
    "    weights=W, \n",
    "    u_degree=p, \n",
    "    v_degree=q, \n",
    "    u_knots=U, \n",
    "    v_knots=V\n",
    ")        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "16a10a7e-a147-4a0b-aff9-3195c87d98b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "air = IdealMaterial(n=1.0)  # air\n",
    "glass = Material(name=\"SF2\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "14d81e27-bd2f-4a94-8f17-99b069184622",
   "metadata": {},
   "outputs": [],
   "source": [
    "new_surface1 = Surface(\n",
    "    geometry=nurbs_geo1,\n",
    "    material_pre=air,\n",
    "    material_post=glass,\n",
    "    is_stop=True,\n",
    ")\n",
    "new_surface2 = Surface(\n",
    "    geometry=nurbs_geo2,\n",
    "    material_pre=glass,\n",
    "    material_post=air,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ec6605aa-c7fa-41ce-b3be-30d76b354eda",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(<Figure size 1000x400 with 1 Axes>, <Axes: xlabel='Z [mm]', ylabel='Y [mm]'>)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens = optic.Optic()\n",
    "\n",
    "# add surfaces\n",
    "lens.add_surface(index=0, radius=be.inf, thickness=be.inf)\n",
    "lens.add_surface(\n",
    "    index=1,\n",
    "    new_surface=new_surface1,\n",
    ") \n",
    "lens.add_surface(\n",
    "    index=2,\n",
    "    new_surface=new_surface2,\n",
    "    thickness=20,\n",
    ") \n",
    "\n",
    "lens.add_surface(index=3)\n",
    "\n",
    "# add aperture\n",
    "lens.set_aperture(aperture_type=\"EPD\", value=40)\n",
    "\n",
    "# add field\n",
    "lens.set_field_type(field_type=\"angle\")\n",
    "lens.add_field(y=0)\n",
    "\n",
    "# add wavelength\n",
    "lens.add_wavelength(value=0.55, is_primary=True)\n",
    "\n",
    "lens.update_paraxial()\n",
    "   \n",
    "lens.draw(num_rays=15)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "optiland (3.13.2)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
